package br.com.faculdade.domain.service;

import br.com.faculdade.infrastructure.dao.ApartamentoDAO;
import br.com.faculdade.infrastructure.dao.HospedeDAO;
import br.com.faculdade.infrastructure.dao.LancamentoDAO;
import br.com.faculdade.infrastructure.dao.ReservaEstadiaDAO;
import br.com.faculdade.infrastructure.dao.TipoApartamentoDAO;
import br.com.faculdade.infrastructure.entity.Apartamento;
import br.com.faculdade.infrastructure.entity.Hospede;
import br.com.faculdade.infrastructure.entity.Lancamento;
import br.com.faculdade.infrastructure.entity.ReservaEstadia;
import br.com.faculdade.infrastructure.entity.TipoApartamento;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.TransactionPropagationType;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.log.Log;

/**
 *
 * @author Kirmaier
 */
@AutoCreate
@Name("reservaHospedagemService")
@Transactional(TransactionPropagationType.SUPPORTS)
public class ReservaHospedagemService implements Serializable {

    @Logger
    private Log log;
    @In
    private ReservaEstadiaDAO reservaEstadiaDAO;
    @In
    private HospedeDAO hospedeDAO;
    @In
    private ApartamentoDAO apartamentoDAO;
    @In
    private TipoApartamentoDAO tipoApartamentoDAO;
    @In
    private LancamentoDAO lancamentoDAO;

    public void alterar(ReservaEstadia reserva, Integer hospedeSelecionado, Integer apartamentoSelecionado) {
        log.info("Invocando DAO para alterar reserva");

        reserva.setApartamento(apartamentoDAO.obterPorId(apartamentoSelecionado));
        reserva.setHospede(hospedeDAO.obterPorId(hospedeSelecionado));

        reservaEstadiaDAO.alterar(reserva);

    }

    public void cancelar() {
        log.info("Invocando DAO para cancelar operação");

        reservaEstadiaDAO.cancelar();
    }

    public ReservaEstadia criar() {
        log.info("Criar novo objeto");
        ReservaEstadia reserva = new ReservaEstadia();
        reserva.setHospede(new Hospede());
        reserva.setApartamento(new Apartamento());
        reserva.setDatamarcacao(new Date());

        return reserva;
    }

    public void excluir(ReservaEstadia reserva) {
        log.info("Invocando DAO para excluir reserva");

        reservaEstadiaDAO.excluir(reserva);
    }

    public Apartamento obterApartamentoPorId(Integer apartamentoSelecionado) {
        log.info("Invocando DAO para obter apartamento por ID");

        return apartamentoDAO.obterPorId(apartamentoSelecionado);
    }

    public List<Apartamento> obterApartamentosPorTipo(Integer tipoApartamento) {
        log.info("Invocando DAO para obter apartamentos por tipo");

        return apartamentoDAO.obterPorTipo(tipoApartamento);
    }

    public List<ReservaEstadia> obterPorParametros(Date paramDataChegada, Date paramDataMarcacao, Short paramStatusReserva, Integer paramTipoApartamento,String paramHospede) {
        log.info("Invocando DAO para pesquisar Reservas");

        return reservaEstadiaDAO.obterPorParametros(paramDataChegada,paramDataMarcacao,paramStatusReserva,paramTipoApartamento, paramHospede);
    }

    public List<Apartamento> obterTodosApartamentos() {
        log.info("Invocando DAO para obter todos apartamentos");

        return apartamentoDAO.obterTodos();
    }

    public List<Hospede> obterTodosHospedes() {
        log.info("Invocando DAO para obter todos hospedes");

        return hospedeDAO.obterTodos();
    }

    public List<TipoApartamento> obterTodosTipos() {
        log.info("Invocando DAO para obter todos tipos de apartamento");

        return tipoApartamentoDAO.obterTodos();
    }

    public void pagamento(Lancamento lancamento, ReservaEstadia reserva) {
        log.info("Invocando DAO para realizar pagamento");

        lancamento.setReservaEstadia(reserva);
        lancamentoDAO.pagamento(lancamento);
    }

    public void salvar(ReservaEstadia reserva, Integer hospedeSelecionado, Integer apartamentoSelecionado) {
        log.info("Invocando DAO para persistir o objeto");

        reserva.setApartamento(apartamentoDAO.obterPorId(apartamentoSelecionado));
        reserva.setHospede(hospedeDAO.obterPorId(hospedeSelecionado));

        reservaEstadiaDAO.salvar(reserva);
    }
}
